#include "../include/console.h"
#include "../include/uart.h"
#include "../include/stdio.h"
#include "../include/types.h"

// 初始化控制台（本质是初始化UART）
void console_init(void) {
    uart_init();
}

// 输出单个字符（处理退格键：\b → 回退+空格+回退）
void console_putc(char c) {
    if (c == BACKSPACE) {
        uart_putc('\b');  // 回退一个字符
        uart_putc(' ');   // 用空格覆盖原字符
        uart_putc('\b');  // 再回退一个字符
    } else {
        uart_putc(c);     // 正常字符直接发送
    }
}

// 输出字符串（逐字符调用console_putc）
void console_puts(const char *s) {
    for (; *s; s++) {
        console_putc(*s);
    }
}

// 清屏（ANSI转义序列：\033[2J 清屏，\033[H 光标回到左上角）
void clear_screen(void) {
    console_puts("\033[2J");  // 清屏命令
    console_puts("\033[H");   // 光标复位命令
}

// 移动光标到(x,y)位置（x=列号，y=行号，均从1开始）
void goto_xy(int x, int y) {
    char buf[32];  // 存储ANSI命令的缓冲区
    // 格式化ANSI命令：\033[y;xH（先行后列）
    sprintf(buf, "\033[%d;%dH", y, x);
    console_puts(buf);  // 发送命令
}

// 删除当前行（从光标位置到行尾，ANSI转义序列：\033[K）
void clear_line(void) {
    console_puts("\033[K");  // 删除行命令
}
